// utils/auth.js - 认证工具类

import api from './api'

// 获取app实例的安全方法
const getAppInstance = () => {
  try {
    return getApp()
  } catch (error) {
    console.warn('App未初始化，某些功能可能受限')
    return null
  }
}

export default {
  // 微信登录
  async wxLogin() {
    try {
      // 获取微信授权码
      const loginResult = await new Promise((resolve, reject) => {
        wx.login({
          success: resolve,
          fail: reject
        })
      })

      if (!loginResult.code) {
        throw new Error('获取微信授权码失败')
      }

      // 调用后端登录接口
      const result = await api.auth.login(loginResult.code)
      
      // 保存token和用户信息
      wx.setStorageSync('token', result.token)
      wx.setStorageSync('userInfo', result.userInfo)
      
      // 更新全局数据
      const app = getAppInstance()
      if (app && app.globalData) {
        app.globalData.token = result.token
        app.globalData.userInfo = result.userInfo
      }
      
      return {
        success: true,
        message: '登录成功',
        data: result
      }
      
    } catch (error) {
      console.error('微信登录失败:', error)
      return {
        success: false,
        message: error.message || '登录失败，请重试'
      }
    }
  },

  // 获取用户授权信息（头像、昵称等）
  async getWechatUserProfile() {
    try {
      const result = await new Promise((resolve, reject) => {
        wx.getUserProfile({
          desc: '用于完善用户资料',
          success: resolve,
          fail: reject
        })
      })
      
      return result.userInfo
      
    } catch (error) {
      console.error('获取用户信息失败:', error)
      throw error
    }
  },

  // 获取用户资料（从服务器）
  async getUserProfile() {
    try {
      const result = await api.auth.getProfile()
      return result
      
    } catch (error) {
      console.error('获取用户资料失败:', error)
      throw error
    }
  },

  // 检查登录状态
  checkLoginStatus() {
    const app = getAppInstance()
    const token = (app && app.globalData ? app.globalData.token : null) || wx.getStorageSync('token')
    const userInfo = (app && app.globalData ? app.globalData.userInfo : null) || wx.getStorageSync('userInfo')
    
    return !!(token && userInfo)
  },

  // 强制登录检查
  requireLogin() {
    if (!this.checkLoginStatus()) {
      wx.showModal({
        title: '需要登录',
        content: '此功能需要登录后使用，是否立即登录？',
        confirmText: '去登录',
        success: (res) => {
          if (res.confirm) {
            this.navigateToLogin()
          }
        }
      })
      return false
    }
    return true
  },

  // 跳转到登录页
  navigateToLogin() {
    wx.navigateTo({
      url: '/pages/auth/login'
    })
  },

  // 退出登录
  logout() {
    wx.showModal({
      title: '确认退出',
      content: '确定要退出登录吗？',
      success: (res) => {
        if (res.confirm) {
          const app = getAppInstance()
          if (app && app.clearAuth) {
            app.clearAuth()
          }
          wx.showToast({
            title: '已退出登录',
            icon: 'success'
          })
          
          // 跳转到首页
          wx.switchTab({
            url: '/pages/index/index'
          })
        }
      }
    })
  },

  // 更新用户信息
  async updateUserInfo(data) {
    try {
      const result = await api.auth.updateProfile(data)
      
      // 获取最新的用户信息
      const updatedUserInfo = await api.auth.getProfile()
      
      // 更新本地存储和全局数据
      wx.setStorageSync('userInfo', updatedUserInfo)
      const app = getAppInstance()
      if (app && app.globalData) {
        app.globalData.userInfo = updatedUserInfo
      }
      
      return updatedUserInfo
      
    } catch (error) {
      console.error('更新用户信息失败:', error)
      throw error
    }
  },

  // 上传头像
  async uploadAvatar(filePath) {
    try {
      const result = await api.auth.uploadAvatar(filePath)
      
      console.log('API返回的头像上传结果:', result)
      
      // 构建完整的头像URL
      let avatarUrl = result.avatar_url || result.url
      if (avatarUrl && !avatarUrl.startsWith('http')) {
        avatarUrl = `https://nzy.congqian.cn${avatarUrl.startsWith('/') ? '' : '/'}${avatarUrl}`
      }
      
      console.log('处理后的头像URL:', avatarUrl)
      
      // 更新用户信息中的头像
      const app = getAppInstance()
      const currentUserInfo = (app && app.globalData ? app.globalData.userInfo : null) || wx.getStorageSync('userInfo')
      
      if (currentUserInfo && avatarUrl) {
        const updatedUserInfo = {
          ...currentUserInfo,
          avatar: avatarUrl
        }
        
        wx.setStorageSync('userInfo', updatedUserInfo)
        if (app && app.globalData) {
          app.globalData.userInfo = updatedUserInfo
        }
        
        console.log('更新后的用户信息:', updatedUserInfo)
      }
      
      // 返回处理后的结果
      return {
        ...result,
        avatar_url: avatarUrl
      }
      
    } catch (error) {
      console.error('上传头像失败:', error)
      throw error
    }
  },

  // 刷新token
  async refreshToken() {
    try {
      const result = await api.auth.refreshToken()
      
      const app = getAppInstance()
      if (app && app.globalData) {
        app.globalData.token = result.token
      }
      wx.setStorageSync('token', result.token)
      
      return result.token
      
    } catch (error) {
      console.error('刷新token失败:', error)
      // token刷新失败，清除认证信息
      const app = getAppInstance()
      if (app && app.clearAuth) {
        app.clearAuth()
      }
      throw error
    }
  },

  // 获取用户位置
  async getUserLocation() {
    try {
      // 检查位置权限
      const authResult = await new Promise((resolve, reject) => {
        wx.getSetting({
          success: (res) => {
            if (res.authSetting['scope.userLocation'] === false) {
              // 用户拒绝过位置权限，需要引导打开设置
              wx.showModal({
                title: '位置权限',
                content: '需要获取您的位置信息来提供导航服务，请在设置中开启位置权限',
                confirmText: '去设置',
                success: (modalRes) => {
                  if (modalRes.confirm) {
                    wx.openSetting()
                  }
                }
              })
              reject(new Error('位置权限被拒绝'))
            } else {
              resolve(res)
            }
          },
          fail: reject
        })
      })

      // 获取位置信息
      const location = await new Promise((resolve, reject) => {
        wx.getLocation({
          type: 'gcj02',
          success: resolve,
          fail: reject
        })
      })

      return location
      
    } catch (error) {
      console.error('获取位置失败:', error)
      throw error
    }
  },

  // 检查手机号授权
  async getPhoneNumber(e) {
    try {
      if (e.detail.errMsg !== 'getPhoneNumber:ok') {
        throw new Error('获取手机号失败')
      }

      // 这里需要配合后端解密手机号
      const { encryptedData, iv } = e.detail
      
      // 调用后端接口解密手机号
      // const phoneResult = await api.auth.decryptPhone({ encryptedData, iv })
      
      return e.detail
      
    } catch (error) {
      console.error('获取手机号失败:', error)
      throw error
    }
  }
}